package com.yingpai.fitness.dvp_2_0.main.util;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;

import com.alipay.sdk.app.PayTask;
import com.tencent.mm.opensdk.modelpay.PayReq;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.yingpai.fitness.dvp_2_0.main.bean.pay.PayResult;

/**
 * Created by tongchang on 2016/12/23.
 * 微信和支付功能
 * <p>
 * <p>
 * //TODO 微信支付：客户端需要将金额和用户信息传给服务端，服务端生成预支付订单，并对订单进行签名后，将信息返回给客户端（返回信息参考下面的wxpay方法的参数），客户端进行支付操作。
 * //TODO 支付宝支付：客户端需要将金额和用户信息传给服务端，服务端创建订单信息，并对订单进行签名，签名后做URL编码，并创建完整的符合支付宝参数规范的订单信息后，将订单信息返回给客户端，客户端进行支付操作。
 */

public class PayUtil
{
    public static codeResultClickInterface interfaces_zfb;//支付宝的接口回掉

    public interface codeResultClickInterface
    {
        public void ZFBSuccess(String code);//支付成功

        public void ZFBFail(String code);//支付失败

        public void ZFBResultQueRen(String code);//支付结果确认中
    }

    @SuppressLint("HandlerLeak")
    public static Handler mHandler = new Handler()
    {
        @SuppressWarnings("unused")
        public void handleMessage(Message msg)
        {
            switch (msg.what)
            {
                case 1:
                {
                    PayResult payResult = new PayResult((String) msg.obj);
                    /**
                     * 同步返回的结果必须放置到服务端进行验证（验证的规则请看https://doc.open.alipay.com/doc2/
                     * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
                     * docType=1) 建议商户依赖异步通知
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息

                    String resultStatus = payResult.getResultStatus();

                    // 判断resultStatus 为“9000”则代表支付成功，具体状态码代表含义可参考接口文档

                    if (TextUtils.equals(resultStatus, "9000"))
                    {
                        interfaces_zfb.ZFBSuccess(resultStatus);
                        //  Toast.makeText(ZhiFuActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                    } else
                    {
                        // 判断resultStatus 为非"9000"则代表可能支付失败
                        // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认，最终交易是否成功以服务端异步通知为准（小概率状态）
                        if (TextUtils.equals(resultStatus, "8000"))
                        {
                            // Toast.makeText(ZhiFuActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();
                            interfaces_zfb.ZFBResultQueRen(resultStatus);
                        } else
                        {
                            // 其他值就可以判断为支付失败，包括用户主动取消支付，或者系统返回的错误
                            // Toast.makeText(ZhiFuActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
                            interfaces_zfb.ZFBFail(resultStatus);
                        }
                    }
                    break;
                }
                default:
                    break;
            }
        }
    };


    static Context contexts;

    /**
     * @param Context
     * @param appId     //公众账号ID
     * @param partnerId //商户号
     * @param prepayId  //预支付交易会话ID
     * @param nonceStr  //随机字符串
     * @param timeStamp //时间戳
     * @param sign      //签名
     * @return
     */
    public static boolean wxpay(Context Context, String appId, String partnerId, String prepayId, String nonceStr, String timeStamp, String sign)
    {
        final IWXAPI msgApi = WXAPIFactory.createWXAPI(Context, null);
        PayReq req = new PayReq();
        req.appId = appId;//公众账号ID
        req.partnerId = partnerId;//商户号
        req.prepayId = prepayId;//预支付交易会话ID
        req.packageValue = "Sign=WXPay";
        req.nonceStr = nonceStr;//随机字符串
        req.timeStamp = timeStamp;//时间戳
        req.sign = sign;
        msgApi.registerApp(appId);
        Boolean ss = msgApi.sendReq(req);
        return ss;
    }

    /**

     * @param payInfo // 完整的支付订单信息
     */
    /**
     * rsa_private //待签名订单信息
     * tradeNo   //生成商户订单号
     * jinE  //金额
     * partner // 商户PID
     */
    public static void zfbpay(codeResultClickInterface interfaces, final Activity context, final String payInfo)
    {
        interfaces_zfb = interfaces;
        contexts = context;
        //TODO 注意，在实际开发中，需要将创建订单信息和签名之类的接口放到服务端去操作，这样确保安全性。只需要接口返回个完整的符合支付宝参数规范的订单信息、rsa_private、tradeNo、jinE即可。
        final String s = "partner=\"2088421653774100\"&seller_id=\"lightonline@foxmail.com\"&out_trade_no=\"20161224110102620\"&subject=\"萌外教\"&body=\"充值金额\"&total_fee=\"0.01\"&notify_url=\"http://120.27.27.2:8080/ad_abc/rest/zfbpay/notify\"&service=\"mobile.securitypay.pay\"&payment_type=\"1\"&_input_charset=\"utf-8\"&it_b_pay=\"30m\"&return_url=\"m.alipay.com\"&sign=\"HU7kb02mZdEqspVWbfuwQgcLLUjqNN6sZMJx4x6S%2BGSTjzIgROTIttuRepvNc2XfeitC8rsAqI7oawaux0XW2C4gtyGPj220La0F0k7eO44JoaWhK%2BRR9ztytke8ywBrTKYOtIHjcPU%2FUlUwNTRHFui%2Bf5P6R0KMc%2Fu%2BGifGSr0%3D\"&sign_type=\"RSA\"";
        System.out.println("1-------------" + s);
        System.out.println("4-------------" + payInfo);
        System.out.println("2-------------" + contexts);
        System.out.println("3-------------" + interfaces);
        Runnable payRunnable = new Runnable()
        {
            @Override
            public void run()
            {
                // 构造PayTask 对象
                PayTask alipay = new PayTask(context);
                // 调用支付接口，获取支付结果
                String result = alipay.pay(payInfo, true);
                Message msg = new Message();
                msg.what = 1;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
        // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }
}
